package jp.seraph.jsade.effector;

import java.util.HashMap;
import java.util.Map;

import jp.seraph.jsade.message.MessageUtil;

/**
 * Naoモデル用エフェクター列挙体
 * 各コメントに書いてある角度は、そのエフェクターによって変化する最大値であり、エフェクターのパラメーターに渡すことのできる値範囲でないため、注意すること
 *
 */
public class NaoEffectorKind implements EffectorKind {
    private NaoEffectorKind(String aName){
        mName = aName;
        KIND_MAP.put(aName, this);
    }

    private String mName;
    private static Map<String, NaoEffectorKind> KIND_MAP = new HashMap<String, NaoEffectorKind>();

    /**
     * エフェクタ名 -> EffectorKindへのマッピングを行います。
     *
     * @param aName エフェクタ名
     * @return 対応するEffectorKind
     * @throws IllegalArgumentException
     */
    public static NaoEffectorKind getEffectorKind(String aName) throws IllegalArgumentException{
        NaoEffectorKind tResult = KIND_MAP.get(aName);
        if(tResult == null)
            throw new IllegalArgumentException(MessageUtil.isNotNaoEffector(aName));

        return tResult;
    }

    /**
     * NaoEffectorKind内に、引数文字列のエフェクタが定義されているかどうかを返す。
     *
     * @param aName
     * @return
     */
    public static boolean containsEffectorName(String aName){
        return KIND_MAP.containsKey(aName);
    }

    /**
     * neck
     * 首の左右回転　-120°〜120°
     */
    public static final NaoEffectorKind HE1 = new NaoEffectorKind("he1");

    /**
     * head
     * 首の上下回転 -45°〜45°
     */
    public static final NaoEffectorKind HE2 = new NaoEffectorKind("he2");

    /**
     * left shoulder
     * 左肩の上下回転 -120°〜120°
     */
    public static final NaoEffectorKind LAE1 = new NaoEffectorKind("lae1");

    /**
     * left upper arm
     * 左肩の左右回転 -1°〜95°
     */
    public static final NaoEffectorKind LAE2 = new NaoEffectorKind("lae2");

    /**
     * left elbow
     * 左肘の左右回転（ねじり） -120°〜120°
     */
    public static final NaoEffectorKind LAE3 = new NaoEffectorKind("lae3");

    /**
     * left lower arm
     * 左肘の折りたたみ -90°〜1°
     */
    public static final NaoEffectorKind LAE4 = new NaoEffectorKind("lae4");

    /**
     * right shoulder
     * 右肩の上下回転 -120°〜120°
     */
    public static final NaoEffectorKind RAE1 = new NaoEffectorKind("rae1");

    /**
     * right upper arm
     * 右肩の左右回転 -95°〜1°
     */
    public static final NaoEffectorKind RAE2 = new NaoEffectorKind("rae2");

    /**
     * right elbow
     * 右肘の左右回転（ねじり） -120°〜120°
     */
    public static final NaoEffectorKind RAE3 = new NaoEffectorKind("rae3");

    /**
     * right low arm
     * 右肘の折りたたみ -1°〜90°
     */
    public static final NaoEffectorKind RAE4 = new NaoEffectorKind("rae4");

    /**
     * left hip1
     * 左股関節の左右回転（ねじり） -90°〜1°
     */
    public static final NaoEffectorKind LLE1 = new NaoEffectorKind("lle1");

    /**
     * left hip2
     * 左股関節の左右回転（開脚） -25°〜45°
     */
    public static final NaoEffectorKind LLE2 = new NaoEffectorKind("lle2");

    /**
     * left thigh
     * 左太股上下回転 -25°〜100°
     */
    public static final NaoEffectorKind LLE3 = new NaoEffectorKind("lle3");

    /**
     * left shank
     * 左膝折りたたみ -130°〜1°
     */
    public static final NaoEffectorKind LLE4 = new NaoEffectorKind("lle4");

    /**
     * left ankle
     * 左足首上下（前後）回転 -45°〜75°
     */
    public static final NaoEffectorKind LLE5 = new NaoEffectorKind("lle5");

    /**
     * left foot
     * 左足首左右回転 -45°〜25°
     */
    public static final NaoEffectorKind LLE6 = new NaoEffectorKind("lle6");

    /**
     * right hip1
     * 右股関節の左右回転（ねじり） -90°〜1°
     */
    public static final NaoEffectorKind RLE1 = new NaoEffectorKind("rle1");

    /**
     * right hip2
     * 右股関節の左右回転（開脚） -45°〜25°
     */
    public static final NaoEffectorKind RLE2 = new NaoEffectorKind("rle2");

    /**
     * right thigh
     * 右太股の上下回転
     */
    public static final NaoEffectorKind RLE3 = new NaoEffectorKind("rle3");

    /**
     * right shank
     * 右膝の折りたたみ -130°〜1°
     */
    public static final NaoEffectorKind RLE4 = new NaoEffectorKind("rle4");

    /**
     * right ankle
     * 右足首の上下（前後）回転 -45°〜75°
     */
    public static final NaoEffectorKind RLE5 = new NaoEffectorKind("rle5");

    /**
     * right foot
     * 右足首の左右回転 -25°〜45°
     */
    public static final NaoEffectorKind RLE6 = new NaoEffectorKind("rle6");

    /**
     * ビームエフェクタ。
     * 試合開始前のみ使用可能らしい
     */
    public static final NaoEffectorKind BEAM = new NaoEffectorKind("beam");

    /**
     * Sayエフェクタ。
     * 周囲にメッセージを飛ばす。
     */
    public static final NaoEffectorKind SAY = new NaoEffectorKind("say");

    /**
     * @see jp.seraph.jsade.effector.EffectorKind#toString()
     */

    public String toString() {
        return mName;
    }

}
